无符号数和有符号数
无符号数
寄存器的位数反映无符号数的表示范围。
有符号数
机器数与真值
真值 | 机器数 |
---|---|
带符号的数 | 符号数字化的数 |
+0.1011 | 0.1011 |
-0.1011 | 1.1011 |
+1100 | 0,1100 |
-1100 | 1,1100 |
原码表示法
定义
整数
$[x]_原=\begin{cases}0,\ x\quad\quad2^n>x\geq0\2^n-x\quad\quad0\geq x>-2^n\end{cases}$
x为真值,n为整数的位数。
使用逗号(,)将符号位与数值部分隔开。
如:
$x=+1110\quad[x]_原=0,1110$
$x=-1110\quad[x]_原=2^4+1110=1,1110$
小数
$[x]_原=\begin{cases}x\quad\quad1>x\geq0\1-x\quad\quad0\geq x>-1\end{cases}$
x为真值。
使用小数点(.)将符号位与数值部分隔开。
如:
$x=+0.1101\quad[x]_原=0.1101$
$x=-0.1101\quad[x]_原=1-(-0.1101)=1.1101$
$x=+0.1000000\quad[x]_原=0.1000000$
特别地:
当$x=0$时,
$[+0.0000]_原=0.0000$
$[-0.0000]_原=1-(0.0000)=1.0000$
可见,$[+0]_原\neq[-0]_原$,即原码中的“零”有两种表示形式
当$x=-1$时,
x不存在原码。(因为按照定义来看,-1和0地补码都为1)
特点
简单、直观。
但是用原码作加法时,会出现如下问题:
要求 | 数1 | 数2 | 实际操作 | 结果符号 |
---|---|---|---|---|
加法 | 正 | 正 | 加 | 正 |
加法 | 正 | 负 | 减 | 可正可负 |
加法 | 负 | 正 | 减 | 可正可负 |
加法 | 负 | 负 | 加 | 负 |
能否只作加法?
找到一个与负数等价的正数来代替这个负数,就可使减→加。(补码)
补码表示法
补的概念
一个负数加上“模”即得该负数的补数。
一个正数和一个负数互为补数时,它们的绝对值之和即为模数。
如计数器(模16),求$1011→0000$?
$1011-1011=0000$
$1011+0101=(1)0000$(1超过表示范围,舍去)
可见,-1011可用+0101代替。
记作:$-1011\equiv+0101\quad(mod\ 2^4)$
同理:$-011\equiv+101\quad(mod\ 2^3)$
$-0.1001\equiv+1.01111\quad(mod\ 2)$
正数的补码即为其本身
两个互为补数的数,分别加上模,结果仍互为补数:
例如:$-1011\equiv+0101\quad(mod\ 2^4)$
$-1011+10000=+0101$
$+0101+10000=+(1)0101$
所以,$+0101\equiv+0101\quad(mod\ 2^4)$
可见,+0101既可作+0101的补码,又可做-1011的补码。
为了区分,需要为补码添加其原码的符号位:
0,0101→+0101
1,0101→-1011
如何得到?
只需增加一位模,即
$2^{4+1}-1011=100000-1011=1,0101$
$2^{4+1}+0101=100000+0101=(1)0,0101$
补码的定义
整数
$[x]_补=\begin{cases}0,\ x\quad\quad2^n>x\geq0\2^{n+1}+x\quad\quad0>x\geq-2^n\ (mod\ 2^{n+1})\end{cases}$
x为真值,n为整数的位数。
如:
$x=+1010\quad[x]_补=0,1010$
$x=-1011000\quad[x]_补=2^{7+1}+(-1011000)$
小数
$[x]_补=\begin{cases}x\quad\quad1>x\geq 0\2+x\quad\quad0>x\geq-1\ (mod\ 2)\end{cases}$
如:
$x=+0.1110\quad[x]_补=0.1110$
$x=-0.1100000\quad[x]_补=2+(-0.1100000)=10.0000000-0.1100000=1.0100000$
求补码的快捷方式
设$x=-1010$,
则$[x]_补=2^{4+1}-1010=100000-1010=1,0110$
$=11111+1-1010=10101+1=1,0110$
又$[x]_原=1,1010$
当真值为负时,补码可用原码除符号位外每位取反,末位加1求得。
举例
已知$[x]_补=0.0001$,求x
解:由定义得 $x=+0.0001$
已知$[x]_补=1.0001$,求x
解:方法(1):由定义得 $x=[x]_补-2=1.0001-10.0000=-0.1111$
方法(2):$[x]_原=1.1111,则x=-0.1111$
已知$[x]_补=1,1110,求x$
解:方法(1):由定义得 $x=[x]_补-2^{4+1}=1,1110-100000=-0010$
方法(2):$[x]_原=1,0010,则x=-0010$
当真值为负时,原码可用补码除符号位外每位取反,末位加1求得。
特别地:
当$x=0$时,
$[+0.0000]_补=[-0.0000]_补=0.0000$
当$x=-1$时,
$[-1]_补=2+x=10.000-1.0000=1.0000$
(但无原码)
反码表示法
定义
整数
$[x]_反=\begin{cases} 0,x\quad 2^n>x\geq0\\ (2^{n+1}-1)+x\quad 0\geq x>-2^n(mod2^{n+1}-1)\end{cases}$
x为真值,n为整数的位数
如:
$x=+1101\quad [x]_反=0,1101$
$x=-1101\quad [x]_反=(2^{4+1}-1)-1101=11111-1101=1,0010$
小数
$[x]_反=\begin{cases} x\quad 1>x\geq 0 \\ (2-2^{-n})+x\quad 0\geq x>-1(mod\ 2-2^{-n})\end{cases}$
如:
$x=+0.1101\quad[x]_反=0.1101$
$x=-0.1010\quad[x]_反=(2-2^{-4})-0.1010=1.1111-0.1010=1.0101$
举例
已知$[x]_反=0,1110,求x$
解:$x=+1110$
已知$[x]_反=1,1110$,求x
解:$x=-0001$
特别地:
当$x=0$时,
设$x=+0.0000$,则$[+0.0000]_反=0.0000$
设$x=-0.0000$,则$[-0.0000]_反=1.1111$
同理,对于整数:$[+0]_反=0,0000$,$[-0]_反=1,1111$
因此,$[+0]_反\neq[-0]_反$
三种机器数的小结
最高位为符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开。
对于正数,原码=补码=反码。
对于负数,符号位为1,其数值部分
原码除符号位外每位取反末位加1 → 补码
原码除符号位外每位取反 → 反码
例题1:设机器字长为8位(其中1位为符号位),对于正数,当其分别代表无符号数、原码、补码和反码时,对应的真值范围各为多少?
解:
二进制代码 | 无符号数的对应真值 | 原码 | 补码 | 反码 |
---|---|---|---|---|
00000000 | 0 | +0 | $\pm0$ | +0 |
00000001 | 1 | +1 | +1 | +1 |
00000010 | 2 | +2 | +2 | +2 |
$\ldots$ | $\ldots$ | $\ldots$ | $\ldots$ | $\ldots$ |
01111111 | 127 | +127 | +127 | +127 |
10000000 | 128 | -0 | -128 | -127 |
10000001 | 129 | -1 | -127 | -126 |
$\ldots$ | $\ldots$ | $\ldots$ | $\ldots$ | $\ldots$ |
11111101 | 253 | -125 | -3 | -2 |
11111110 | 254 | -126 | -2 | -1 |
11111111 | 255 | -127 | -1 | -0 |
例题2:已知$[y]_补$,求$[-y]_补$。
解:设$[y]_补=y_0.y_1y_2\ldots y_n$
若y为正数,$[y]_补=0.y_1y_2\ldots y_n$
则$y=0.y_1y_2\ldots y_n$
$-y=-0.y_1y_2\ldots y_n$
得$[-y]_补=1.\overline{y_1}\overline{y_2}\ldots\overline{y_n}+2^{-n}$
$[y]_补$连同符号位在内,每位取反,末位加1,即得$[-y]_补$。
若y为负数,$[y]_补=1.y_1y_2\ldots y_n$
则$[y]_原=1.\overline{y_1}\overline{y_2}\ldots \overline{y_n}+2^{-n}$
$y=-(0.\overline{y_1}\overline{y_2}\ldots \overline{y_n}+2^{-n})$
$-y=0.\overline{y_1}\overline{y_2}\ldots \overline{y_n}+2^{-n}$
$[-y]_补=0.\overline{y_1}\overline{y_2}\ldots\overline{y_n}+2^{-n}$
$[y]_补$连同符号位在内,每位取反,末位加1,即得$[-y]_补$。
移码表示法
补码表示很难直接判断其真值大小。
如:
十进制 | 二进制 | 补码 |
---|---|---|
+21 | +10101 | 0,10101 |
-21 | -10101 | 1,01011 |
+31 | +11111 | 0,11111 |
-31 | -11111 | 1,00001 |
上述补码表示中“,”在计算机内部是不存在的,因此,从代码形式看,符号位也是一位二进制数。按这6位二进制代码比较大小的话,会得出$101011>010101$,$100001>011111$,其实恰恰相反。
如果每个真值加上一个$2^n$(n为整数的位数),则有:
$+10101+100000=110101$
$-10101+100000=001011$
$+11111+100000=111111$
$-11111+100000=000001$
定义
$[x]_移=2^n+x(2^n>x\geq-2^n)$
x为真值,n为整数的位数
如:
$x=10100$
$[x]_移=2^5+10100=1,10100$
$x=-10100$
$[x]_移=2^5-10100=0,01100$
移码和补码的比较
设 $x=+1100100$
$[x]_移=2^7+1100100=1,1100100$
$[x]_补=0,1100100$
设 $x=-1100100$
$[x]_移=2^7-1100100=0,0011100$
$[x]_补=1,0011100$
补码和移码只差一个符号位。
真值、补码和移码的对照表
真值x(n=5) $[x]_补$ $[x]_移$ $[x]_移对应的十进制整数$ -100000 100000 000000 0 -11111 100001 000001 1 -11110 100010 000010 2 $\ldots$ $\ldots$ $\ldots$ $\ldots$ -00001 111111 011111 31 ±00000 000000 100000 32 +00001 000001 100001 33 +00010 000010 100010 34 $\ldots$ $\ldots$ $\ldots$ $\ldots$ +11110 011110 111110 62 +11111 011111 111111 63 移码的特点
当x=0时
$[+0]_移=2^5+0=1,00000$
$[-0]_移=2^5-0=1,00000$
$[+0]_移=[-0]_移$
当n=5时
最小真值为$-2^5=-100000$
$[-100000]_移=2^5-100000=000000$
可见,最小真值的移位为全0。
数的定点表示和浮点表示
定点表示
定点机 | 原码 | 补码 | 反码 |
---|---|---|---|
小数定点机 | $-(1-2^{-n})$~$+(1-2^{-n})$ | $-1$~$+(1-2^{-n})$ | $-(1-2^{-n})$~$+(1-2^{-n})$ |
整数定点机 | $-(2^n-1)$~$+(2^n-1)$ | $-2^n$~$+(2^n-1)$ | $-(2^n-1)$~$+(2^n-1)$ |
浮点表示
为什么在计算机中要引入浮点数表示?
编程困难,程序员要调节小数点的位置。
数的表示范围小,为了能表示两个大小相差很大的数据,需要很长的机器字长。
数据存储单元的利用率往往很低。
浮点表示的格式是什么?
浮点数的一般形式:$N=S×r^j$
S:尾数
j:阶码
r:尾数的基值(计算机中r取2、4、8、16等)
当$r=2$,
$N=11.0101=0.110101×2^{10}=1.10101×2^1=1101.01×2^{-10}$
计算机中,S为小数、可正可负,j为整数、可正可负。
尾数和阶码的基值必须是2吗?基值的影响?
表数范围与精度和哪些因素有关?
为什么要引入规格化表示?
目前浮点数表示格式的标准是什么?
浮点数的表示形式
浮点数的表示范围
上溢:阶码>最大阶码
下溢:阶码<最小阶码 按机器零处理
浮点数的规格化形式
基数不同,浮点数的规格化形式不同。
r=2 尾数最高位为1
r=4 尾数最高2位不全为0
r=8 尾数最高3位不全为0
浮点数的规格化
r=2
左规 尾数左移1位,阶码减1
右规 尾数右移1位,阶码加1
r=4
左规 尾数左移2位,阶码减1
右规 尾数右移2位,阶码加1
r=8
左规 尾数左移3位,阶码减1
右规 尾数右移3位,阶码加1
基数r越大,可表示的浮点数的范围越大。
基数r越大,浮点数的精度越低。